/*
 * =====================================================================================
 *
 *       Filename:  Text.cpp
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  2015年03月27日 22时04分07秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  LiuYi (), swliuyi@gmail.com
 *   Organization:  
 *
 * =====================================================================================
 */
#include "Text.h"
using namespace std;
//
//Text::Text(string path, size_t length):m_index(0)
//{
//	filebuf *pbuf;
//	ifstream filestr;
//	// 采用二进制打开 
//	filestr.open(path.c_str(), ios::binary);
//	if(!filestr)
//    {
//        cerr<<path<<" Load text error."<<endl;
//		return;
//    }
//	// 获取filestr对应buffer对象的指针 
//	pbuf=filestr.rdbuf();
//	// 调用buffer对象方法获取文件大小
//	m_length=(int)pbuf->pubseekoff(0,ios::end,ios::in);
//    if( m_length < length )
//    {
//       cerr<<path<<"Text hasn't  enough length"<<endl;
//    }
//    else
//    {
//        m_length = length;
//    }
//	pbuf->pubseekpos(0,ios::in);
//	// 分配内存空间
//	m_binaryStr = new char[m_length+1];
//	// 获取文件内容
//	pbuf->sgetn(m_binaryStr,m_length);
//	//关闭文件
//	filestr.close();
//}

Text::Text() { }

bool Text::LoadText(string path)
{
	filebuf *pbuf;
	ifstream filestr;
	// 采用二进制打开 
	filestr.open(path.c_str(), ios::binary);
	if(!filestr)
    {
        cerr<<path<<" Load text error."<<endl;
		return false;
    }
	// 获取filestr对应buffer对象的指针 
	pbuf=filestr.rdbuf();
	// 调用buffer对象方法获取文件大小
	int length= (int)pbuf->pubseekoff(0,ios::end,ios::in);
    if( length > INT_MAX )
    {
        cerr<<"text :"<<path<<"is too long to load :"<<INT_MAX<<"chars"<<endl;
    }
	pbuf->pubseekpos(0,ios::in);
	// 分配内存空间
	char * binaryStr = new char[length+1];
	// 获取文件内容
	pbuf->sgetn(binaryStr,length);
	//关闭文件
    SentCut(binaryStr, length);
	filestr.close();
    return true;
}

int Text::SentCut(char * binaryStr, int length)
{
    string s;
    int index = 0;
    vector<string> sent;
    while(ReadOneChar(binaryStr, length, s, index))
    {
        //cout<<s<<" !size! "<<s.size()<<endl;
        if( s == "\n" )
        {
            continue;
        }
        if( sent.size() == 0 && s != " " )
        {
            sent.push_back(" ");
        }
        if( s != "." && s != "。" )
        {
            sent.push_back(s);
        }
        else
        {
            sent.push_back(" ");
            sent.push_back(s);
            m_text.push_back(sent);
            sent.clear();
        }
    }
    if( sent.size() != 0 )
    {
        m_text.push_back(sent);
    }
    m_sentNum = m_text.size();
    return m_sentNum;
}

vector<string> Text::operator[](int n)
{
    if( n >= m_sentNum )
    {
        cerr<<"vector text outof range"<<endl;
        vector<string> tmp;
        return tmp;
    }
    return m_text[n];
}

int Text::SentSize()
{
    return m_sentNum;
}

Text::~Text()
{
}
